package com.kobe.game_40;

/**
 * 
 * Euler published the remarkable quadratic formula:
 * 
 * n² + n + 41
 * 
 * It turns out that the formula will produce 40 primes for the consecutive
 * values n = 0 to 39. However, when n = 40, 40^(2) + 40 + 41 = 40(40 + 1) + 41
 * is divisible by 41, and certainly when n = 41, 41² + 41 + 41 is clearly
 * divisible by 41.
 * 
 * Using computers, the incredible formula n² − 79n + 1601 was discovered, which
 * produces 80 primes for the consecutive values n = 0 to 79. The product of the
 * coefficients, −79 and 1601, is −126479.
 * 
 * Considering quadratics of the form:
 * 
 * n² + an + b, where |a| < 1000 and |b| < 1000
 * 
 * where |n| is the modulus/absolute value of n e.g. |11| = 11 and |−4| = 4
 * 
 * Find the product of the coefficients, a and b, for the quadratic expression
 * that produces the maximum number of primes for consecutive values of n,
 * starting with n = 0.
 * 
 * 
 */
public class Game27 {

    public static void main(String[] args) {
        int primeCount = 0;
        int maxPrimeCount = 0;
        int result = 0;

        for (int a = -999; a <= 999; a++) {
            Loop: for (int b = -999; b <= 999; b++) {
                primeCount = 0;
                for (int n = 0;; n++) {
                    if (isPrime(n * n + a * n + b)) {
                        primeCount++;
                    } else {
                        if (primeCount > maxPrimeCount) {
                            maxPrimeCount = primeCount;
                            result = a * b;
                        }
                        continue Loop;
                    }
                }
            }
        }
        System.out.println(result);
    }

    public static boolean isPrime(int number) {
        number = number < 0 ? number * (-1) : number;

        int sqrt = ((Double) Math.sqrt(number)).intValue();
        boolean isPrime = true;

        if (number % 2 == 0 && number != 2) {
            isPrime = false;
        } else {
            for (int i = 3; i <= sqrt; i += 2) {
                if (number % i == 0) {
                    isPrime = false;
                    break;
                }
            }
        }
        return isPrime;
    }
}
